﻿using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Content;
using CellarDoor.Gui;

namespace CellarDoor.Gui.Theming
{
    public class TiledRectangleReader : ContentTypeReader<UiRectangle>
    {
        protected override UiRectangle Read(
            ContentReader input, UiRectangle existingInstance)
        {
            Rectangle rectangle1 = input.ReadObject<Rectangle>();
            Rectangle rectangle2 = input.ReadObject<Rectangle>();
            return new UiRectangle(rectangle1, rectangle2);
        }
    }

    public class UiThemeSpriteReader : ContentTypeReader<UiThemeSprite>
    {
        protected override UiThemeSprite Read(ContentReader input, UiThemeSprite existingInstance)
        {
            existingInstance = new UiThemeSprite();

            existingInstance.Name = input.ReadString();
            existingInstance.Resolution = input.ReadInt32();
            existingInstance.Rectangle = input.ReadObject<UiRectangle>();
            input.ReadSharedResource<Texture2D>((texture) => {
                existingInstance.Texture = texture;
            });

            return existingInstance;
        }
    }

    public class UiThemeElemetReader : ContentTypeReader<UiThemeElement>
    {
        protected override UiThemeElement Read(ContentReader input, UiThemeElement existingInstance)
        {
            string name = input.ReadString();
            int resolution = input.ReadInt32();
            int numRects = input.ReadInt32();
            List<UiThemeSprite> rectangles = new List<UiThemeSprite>(numRects);
            for (int i = 0; i < numRects; i++)
            {
                rectangles.Add(input.ReadObject<UiThemeSprite>());
            }
            
            return new UiThemeElement(name, resolution, rectangles);
        }
    }

    public class UiThemeFontReader : ContentTypeReader<UiThemeFont>
    {
        protected override UiThemeFont Read(ContentReader input, UiThemeFont existingInstance)
        {
            string name = input.ReadString();
            int resolution = input.ReadInt32();
            SpriteFont font = input.ReadExternalReference<SpriteFont>();
            return new UiThemeFont(name, font, resolution);
        }
    }

    public class UiThemeReader : ContentTypeReader<UiTheme>
    {
        protected override UiTheme Read(ContentReader input, UiTheme existingInstance)
        {
            int numFonts = input.ReadInt32();
            List<UiThemeFont> fonts = new List<UiThemeFont>(numFonts);
            for (int i = 0; i < numFonts; i++)
            {
                fonts.Add(input.ReadObject<UiThemeFont>());
            }

            int numSprites = input.ReadInt32();
            List<UiThemeSprite> sprites = new List<UiThemeSprite>(numSprites);
            for (int i = 0; i < numSprites; i++)
            {
                sprites.Add(input.ReadObject<UiThemeSprite>());
            }

            int numElements = input.ReadInt32();
            List<UiThemeElement> elements = new List<UiThemeElement>(numElements);
            for (int i = 0; i < numElements; i++)
            {
                elements.Add(input.ReadObject<UiThemeElement>());
            }

            return new UiTheme(elements, fonts, sprites);
        }
    }
}
